/*
 * 教材中的示例程序之完整版.
 * 书名：《编译原理基础》
 * 版次：第三版
 * 作者：王献青，张立勇，张淑平，刘坚
 * 出版社：西安电子科技大学出版社
 * 程序完成时间：2025.03
 */

//
// 文件内容：语义处理程序的API声明头文件
//

#ifndef CHAP04_CALC_SEMANTICS_H
#define CHAP04_CALC_SEMANTICS_H

#include <stdbool.h>

#include "../chap03_rdp/lexer.h"

typedef struct Node {       // 语法树结点类型
    TokenKind token;        // 枚举类型定义的记号类别
    struct Node * left;     // 左孩子
    struct Node * right;    // 右孩子
    double  numValue;   // token==NUM|ID 时有效
} Node;

typedef struct Node * Node_Ptr;      // 指向语法树结点的指针类型

extern void     printTree(Node_Ptr root);
extern double   computeValue(Node_Ptr root);
extern Node_Ptr makeNode(TokenKind op, Node_Ptr left, Node_Ptr right);
extern Node_Ptr makeLeaf(TokenKind op, const char * text);

extern void set_trace(bool is_print);
extern bool is_trace();


#endif //CHAP04_CALC_SEMANTICS_H
